package com.cloudfun.campusshare.device.protocol.command;

import com.cloudfun.campusshare.util.ByteUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 干衣机
 * Created by Huqin on 2020/3/12
 */
public class GgyCommandFactory extends CommandFactory {

    private static Map<Integer, Byte> tempLevelMap = new HashMap<>();

    static {
        tempLevelMap.put(1, (byte) 0);
        tempLevelMap.put(2, (byte) 1);
        tempLevelMap.put(3, (byte) 3);
        tempLevelMap.put(4, (byte) 2);
    }

    @Override
    public Frame start() {
        throw new UnsupportedOperationException("Ggy start not supported");
    }

    @Override
    public Frame pause() {
        throw new UnsupportedOperationException("Ggy pause not supported");
    }

    /**
     * 设置加热时间
     *
     * @param tempLevel
     * @return
     */
    public Frame setTempLevel(int tempLevel) {
        return new Frame((byte) 1, ByteUtil.hexStringToByte("4d06" + tempLevel));
    }

    /**
     * 设置加热时间
     *
     * @param heatTime
     * @return
     */
    public Frame setHeatTime(int heatTime) {
        return new Frame((byte) 1, ByteUtil.hexStringToByte("4d07" + heatTime));
    }

    /**
     * 线上开始/停止预约（0--取消预约;1--开始预约）
     *
     * @param preUse
     * @return
     */
    public Frame preUse(int preUse) {
        return new Frame((byte) 1, ByteUtil.hexStringToByte("4d0c" + preUse));
    }

    /**
     * 恢复到待机状态
     *
     * @return
     */
    public Frame reset() {
        return new Frame((byte) 1, ByteUtil.hexStringToByte("4d0d"));
    }

    public Frame startEnabled() {
        return new Frame((byte) 1, ByteUtil.hexStringToByte("8d00"));
    }


    /**
     * washType:
     * 0Dh对应着“筒自洁”
     * 1Ch对应着“单脱”
     * 1Fh对应着“冷水（标准）”
     * 20h对应着“温水（快速）”
     * 21h对应着“热水（大物）”
     * 22h对应着“轻柔” 8公斤滚筒洗衣机不支持
     */
    public Frame washGroupCommand(int tempLevel, int heatTime, boolean startEnabled, int startEnabledTimeout) {
        List<byte[]> byteList = new ArrayList<>();
        // 参数1 设定温度模式
        if (!tempLevelMap.containsKey(tempLevel)) {
            throw new RuntimeException("tempLevel '" + tempLevel + "' not supported");
        }
        byte[] tempLevelBytes = new byte[]{0, tempLevelMap.get(tempLevel)};
        byteList.add(tempLevelBytes);
        // 参数2 设置加热时间
        byte[] bytes = ByteUtil.int2Bytes(heatTime);
        byte[] heatTimeBytes = new byte[]{bytes[2], bytes[3]};
        byteList.add(heatTimeBytes);
        // 参数3\4\5
        byte[] emptyParam = new byte[]{0, 0};
        byteList.add(emptyParam);
        byteList.add(emptyParam);
        byteList.add(emptyParam);
        // 参数6  启动等待使能
        byte[] startEnabledBytes = startEnabled ? new byte[]{0, (byte) 1} : new byte[]{0, (byte) 0};
        byteList.add(startEnabledBytes);
        // 参数7 启动等待超时时间
        bytes = ByteUtil.int2Bytes(startEnabledTimeout);
        byte[] startEnabledTimeoutBytes = new byte[]{bytes[2], bytes[3]};
        byteList.add(startEnabledTimeoutBytes);
        byte[] params = ByteUtil.merge(byteList);
        // 子命令类型
        byte[] subCommandType = new byte[]{0, 1};
        return groupCommand(subCommandType, params);
    }

}
